/*
 * mot.h
 *
 *  Created on: Nov 18, 2021
 *      Author: zz
 */

#ifndef APP_MOT_H_
#define APP_MOT_H_

#include "main.h"
#include "stm32f1xx_it.h"

/**
 * MOT_FILTER_FACTOR 滤波因子，N个脉冲计算一次电机转速
 * 实际转速 = Hz / (MOT_REDUCTION_FACTOR*MOT_PULSE_COUNT)
 * Hz = 霍尔传感器脉冲频率
 */
#define MOT_FILTER_FACTOR			5  		//滤波因子
#define MOT_REDUCTION_FACTOR		19		//电机减速比
#define MOT_PULSE_COUNT				11		//编码器1圈脉冲数
#define MOT_NUM						2       //电机个数  左、右两个
#define	MOT_TIMEOUT					100		//MOT_FILTER_FACTOR个脉冲超时时间，RPM视为0

typedef enum {
	DIR_FORWARD,
	DIR_REVERSE
}MOT_DIR;

// 电机编码器反馈转速信息
struct MotEncoder{
	MOT_DIR	 dir;		//0-正传 1-翻转
	double rpm;
	uint32_t timepoint; //最近一次计算rpm的时间（tick/ms）
	uint32_t wd_ms;   	//最近一次时间ms
	uint32_t wd_us;		//最近一次时间us
	uint32_t wd_idx; 	//写入计数的tick
	uint32_t pulse_time[MOT_FILTER_FACTOR];  //最近N个脉冲的周期 us
};

// 电机初始化
void mot_init();

// 电机处理函数, 周期执行， 计算电机转速；置于定时器中
void mot_proc(void* arg);

// 获取电机转速及时间点
int mot_get(uint8_t no, double* rpm, uint32_t* timepoint);

// 获取电机编码器raw信息
int mot_get_rawinfo(uint8_t no, struct MotEncoder** praw);

/**
 * 电机转速设置 no-电机编号， percent-电机转速百分比x10（*10， 32%-->320）
 */
int mot_set(uint8_t no, int percent);

void mot_dump();

#endif /* APP_MOT_H_ */
